import pandas as pd
import random


def main():
    # 设置随机种子
    random.seed(42)

    # 数据读取
    try:
        movies = pd.read_csv('movies.csv')  # 电影信息
        ratings = pd.read_csv('ratings.csv')  # 用户评分数据
        tags = pd.read_csv('tags.csv')  # 用户标签数据（包含评论）
    except FileNotFoundError as e:
        print(f"错误：找不到数据文件 - {e}")
        return  # 若文件缺失，终止程序

    # 数据筛选：只保留有用户评论的电影
    movies_with_reviews = movies[movies['movieId'].isin(ratings['movieId'].unique())]

    # 每个用户至少有5个交互记录
    user_interactions = ratings.groupby('userId').size()
    valid_users = user_interactions[user_interactions >= 5].index
    ratings = ratings[ratings['userId'].isin(valid_users)]

    # 只保留评分记录作为“点击”指标
    ratings['clicked'] = ratings['rating'].apply(lambda x: 1 if x >= 3 else 0)

    # 获取用户历史记录（电影简介拼接）和电影简介
    user_histories = ratings.groupby('userId')['movieId'].apply(list)
    movies_dict = movies.set_index('movieId')['genres'].to_dict()

    # 获取用户评论（清洗）
    tags['tag'] = tags['tag'].str.replace('[^a-zA-Z0-9\s]', '', regex=True)  # 清理非字母字符
    user_comments = tags.groupby(['userId', 'movieId'])['tag'].apply(' '.join).reset_index()

    # 显示处理后的数据
    print("处理后的电影数据（前5行）：")
    print(movies.head())
    print("\n处理后的评分数据（前5行）：")
    print(ratings.head())

    # 保存筛选后的电影数据
    movies_with_reviews.to_csv('processed_movies.csv', index=False)
    print("\n已保存筛选后的电影数据到 processed_movies.csv")

    # 保存处理后的评分数据（含clicked列）
    ratings.to_csv('processed_ratings.csv', index=False)
    print("已保存处理后的评分数据到 processed_ratings.csv")

    # 保存清洗后的用户评论数据
    user_comments.to_csv('processed_user_comments.csv', index=False)
    print("已保存清洗后的用户评论数据到 processed_user_comments.csv")

    # 保存用户历史记录（转换为字符串格式存储）
    user_histories_df = user_histories.reset_index()
    user_histories_df.columns = ['userId', 'movieId_list']
    user_histories_df['movieId_list'] = user_histories_df['movieId_list'].apply(lambda x: ','.join(map(str, x)))
    user_histories_df.to_csv('user_histories.csv', index=False)
    print("已保存用户历史记录到 user_histories.csv")

if __name__ == "__main__":
    main()